# 主要用于实现成员关系的检测，对应的运算符是 in 和 not in

class C:

    def __init__(self, data):
        self.data = data

    def __contains__(self, item):
        print(F"执行了魔法方法__contains__，传入{item}")
        return item in self.data


c = C([1, 2, 3, 4, 5])

print("================================================================================" * 3)

r = 3 in c
# 执行了魔法方法__contains__，传入3

print("================================================================================" * 3)

e_6 = 6 in c
# 执行了魔法方法__contains__，传入6


print("================================================================================" * 3)


# 如果对象没有实现 __contains__ 方法，但是在 in 或者 not in 运算中使用，那么就会去找 __iter__ 跟 __next__ 方法

class D:

    def __init__(self, data):
        self.data = data

    def __iter__(self):
        print("__iter__", end=' -> ')
        self.i = 0
        return self

    def __next__(self):
        print("__next__", end=' -> ')
        if self.i == len(self.data):
            raise StopIteration
        item = self.data[self.i]
        self.i += 1
        return item


d = D([1, 2, 3, 4, 5])
d_3 = 3 in d
# __iter__（得到一个迭代器） -> __next__ （然后一个一个去判断）-> __next__ -> __next__ ->
print()
# 当 Python 找不到 __contains__ 的时候，就会去找 Iter 跟 __next__ 方法
print(d_3)

print("================================================================================" * 3)


# 如果对象没有实现 __contains__ 方法，也没有实现__iter__ 跟 __next__ 方法，但是在 in 或者 not in 运算中使用，那么就会去找 __getitem__ 方法

class E:

    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        print("Getitem", end=" -> ")
        return self.data[index]


e = E([1, 2, 3, 4, 5])
e_3 = 3 in e
# Getitem -> Getitem -> Getitem ->
print()
print(e_3)

print("================================================================================" * 3)


class F:

    def __init__(self, data):
        self.data = data

    def __iter__(self):
        print("__iter__", end=' -> ')
        self.i = 0
        return self

    def __next__(self):
        print("__next__", end=' -> ')
        if self.i == len(self.data):
            raise StopIteration
        item = self.data[self.i]
        self.i += 1
        return item

    # 明确表示不支持 in 跟 not in 运算
    __contains__ = None


f = F([1, 2, 3, 4, 5])
e_3 = 3 in f
# TypeError: 'F' object is not a container
